package com.zhx.common.user.service.adapter;

import cn.hutool.core.bean.BeanUtil;
import com.zhx.common.common.domain.enums.YesOrNoEnum;
import com.zhx.common.user.domain.entity.ItemConfig;
import com.zhx.common.user.domain.entity.User;
import com.zhx.common.user.domain.entity.UserBackpack;
import com.zhx.common.user.domain.vo.resp.user.BadgeResp;
import com.zhx.common.user.domain.vo.resp.user.UserInfoResp;
import me.chanjar.weixin.common.bean.WxOAuth2UserInfo;

import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public class UserAdapter {
    public static User builderUserSave(String openId) {
        return User.builder().openId(openId).build();

    }

    public static User buildAuthorizeUser(Long id, WxOAuth2UserInfo userInfo) {
        User user = new User();
        user.setId(id);
        user.setName(userInfo.getNickname());
        user.setAvatar(userInfo.getHeadImgUrl());
        return user;
    }

    public static UserInfoResp builderUserInfo(User user, Integer modifyNameCount) {
        UserInfoResp userInfo = new UserInfoResp();
        BeanUtil.copyProperties(user, userInfo);
        userInfo.setModifyNameChance(modifyNameCount);
        return userInfo;
    }

    /**
     * 根据给定的参数生成BadgeResp列表
     *
     * @param itemConfigs 物品配置列表
     * @param backpacks   用户背包列表
     * @param user        用户对象
     * @return BadgeResp列表
     */
    public static List<BadgeResp> builderBadgeResp(List<ItemConfig> itemConfigs, List<UserBackpack> backpacks, User user) {
        // 获取背包中的物品ID列表
        List<Long> obtainItemId = backpacks.stream().map(UserBackpack::getItemId).collect(Collectors.toList());

        // 遍历物品配置列表，生成BadgeResp对象
        return itemConfigs.stream()
                .map(a -> {
                    // 创建BadgeResp对象
                    BadgeResp resp = new BadgeResp();
                    // 将物品配置对象的属性复制到BadgeResp对象中
                    BeanUtil.copyProperties(a, resp);
                    // 根据背包中是否存在该物品，设置是否已获得属性
                    resp.setObtain(obtainItemId.contains(a.getId()) ? YesOrNoEnum.YES.getStatus() : YesOrNoEnum.NO.getStatus());
                    // 根据用户是否装备该物品，设置是否已装备属性
                    resp.setWear(Objects.equals(user.getItemId(), a.getId()) ? YesOrNoEnum.YES.getStatus() : YesOrNoEnum.NO.getStatus());
                    // 返回生成的BadgeResp对象
                    return resp;
                })
                // 根据是否已装备和是否已获得属性进行排序
                .sorted(Comparator
                                .comparing(BadgeResp::getWear, Comparator.reverseOrder())
                                .thenComparing(BadgeResp::getObtain, Comparator.reverseOrder()))
                // 将排序后的BadgeResp对象列表转换为List类型并返回
                .collect(Collectors.toList());
    }

}
